package com.ruoyi.web.tasks;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.scheduling.annotation.Scheduled;

import java.io.File;
import java.util.ArrayList;
import java.util.List;

//@Component
public class FileDeleteTask {

    private static final Logger log = LoggerFactory.getLogger(FileDeleteTask.class);

    //定时任务执行频率（cron表达式更为灵活），在线生成cron表达式：https://cron.ciding.cc/
    private static final String CRON = "0/5 * *  * * ?"; // 示例，每5秒执行一次，可以改成自己想要的频率

    private static final String FILE_PATH = "C:\\Users\\A\\Desktop\\新建文件夹"; // 监控的物理路径

    private static final String FILE_EXT = "wav,mp3"; // 监控的文件后缀，多个,隔开

    private static final Integer EXPIRE_TIME = 400;//单位秒，3600表示大于一个小时的文件属于过期文件将被删除

    @Scheduled(cron = CRON)
    public void execute() {

        try {
            log.info("===========定时清理文件定时任务：开始=====");

            run();

            log.info("===========定时清理文件定时任务：完成=====");
        } catch (Exception e) {
            log.info("===========定时清理文件定时任务：异常=====");
        } finally {
            log.info("===========定时清理文件定时任务：结束=====");
        }

    }

    private void run() {
        List<File> fileList = getFileList();
        for (File file : fileList) {
            try {
                //System.out.println("文件名：" + file.getAbsolutePath());
                if (isExpired(file.getAbsolutePath())) {
                    if (file.exists() && file.isFile()) {
                        file.delete();
                        log.info("文件：{}已过期删除", file.getAbsolutePath());
                    }
                } else {
                    log.debug("文件：{}未过期", file.getAbsolutePath());
                }
            } catch (Exception e) {
                log.error("删除文件{}异常", file.getAbsolutePath(), e);
            }
        }

    }

    //获取所有文件
    private List<File> getFileList() {

        File file = new File(FILE_PATH);
        if (!file.exists()) {
            throw new RuntimeException("文件夹：" + FILE_PATH + "不存在");
        }
        if (!file.isDirectory()) {
            throw new RuntimeException("文件夹：" + FILE_PATH + "不是文件夹");
        }
        List<File> list = new ArrayList<>();
        File[] files = file.listFiles();
        for (File file1 : files) {
            //判断后缀是否符合要求
            String s = file1.getName().toLowerCase();
            int i = s.lastIndexOf(".");
            if (i <= 0) {
                continue;
            }
            String suffix = s.substring(i + 1);

            //System.out.println("suffix=" + suffix);

            if (("," + FILE_EXT).contains("," + suffix.toLowerCase())) {
                list.add(file1);
            }
        }
        return list;
    }

    //判断文件是否过期
    private boolean isExpired(String fileName) {

        String s = fileName.toLowerCase();
        int i = s.lastIndexOf(".");
        if (i <= 0) {
            return false;
        }
        String s1 = s.substring(0, i);
        if (s1.length() < 13) {
            return false;
        }

        s1 = s1.substring(s1.length() - 13);
        //System.out.println("s1=" + s1);

        try {
            long createTime = Long.parseLong(s1);
            long t = (System.currentTimeMillis() - createTime) / 1000;//距离现在多少秒

            //System.out.println("创建时间戳:" + createTime);
            //System.out.println("相差秒：" + t);

            return t > EXPIRE_TIME;
        } catch (Exception e) {
            //ignore
        }

        return false;
    }


}
